package service.clazz;

import entity.config.ConfigInfo;
import entity.config.JdbcGeneration;
import entity.config.PackageGeneration;
import entity.config.TableGeneration;
import entity.config.TempleGeneration;
import entity.table.TableDto;
import entity.table.TableFileDto;
import entity.table.TableInfoDto;
import service.clazz.strategy.ClazzDaoStrategy;
import service.clazz.strategy.ClazzDtoStrategy;
import service.clazz.strategy.ClazzEntityStrategy;
import service.clazz.strategy.ClazzMapperStrategy;
import service.clazz.strategy.ClazzQueryStrategy;
import service.clazz.strategy.ClazzServiceControllerStrategy;
import service.clazz.strategy.ClazzServiceImplStrategy;
import service.clazz.strategy.ClazzServiceStrategy;
import service.clazz.strategy.ClazzVoStrategy;
import utils.common.JdbcUtil;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 类数据服务
 */
public class ClazzService {

    /**
     * 生成类
     */
    private List<TableFileDto> generateClazz(List<TableDto> list, TableInfoDto tableInfoDto) {
        List<TableFileDto> clazzList = new ArrayList<>();
        ContextStrategy contextStrategy = null;

        // 实体类
        contextStrategy= new ContextStrategy(new ClazzEntityStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // vo
        contextStrategy= new ContextStrategy(new ClazzVoStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // query
        contextStrategy = new ContextStrategy(new ClazzQueryStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // dto
        contextStrategy = new ContextStrategy(new ClazzDtoStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // service
        contextStrategy = new ContextStrategy(new ClazzServiceStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // serviceImpl
        contextStrategy = new ContextStrategy(new ClazzServiceImplStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // dao
        contextStrategy = new ContextStrategy(new ClazzDaoStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // mapper
        contextStrategy = new ContextStrategy(new ClazzMapperStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));

        // mapper
        contextStrategy = new ContextStrategy(new ClazzServiceControllerStrategy());
        clazzList.add(contextStrategy.contextInterface(list, tableInfoDto));
        return clazzList;
    }

    // 指定方式获取表结构
    private List<TableDto> sqlQuery(ConfigInfo configInfo) {
        String sql = "SELECT table_name, column_name, data_type, column_comment, column_key FROM information_schema. COLUMNS WHERE table_name in ( {0} )";
        String name = MessageFormat.format(sql, "'"+configInfo.getTable().getName()+"'");
        JdbcUtil.config(configInfo.getJdbc());
        return JdbcUtil.DBManager(name);
    }

    // 解析表数据
    public List<TableFileDto> parsingTable(ConfigInfo configInfo) {
        TableInfoDto tableInfoDto = new TableInfoDto();

        PackageGeneration packages = configInfo.getPackages();
        tableInfoDto.setEntityPackaging(packages.getEntity());
        tableInfoDto.setServicePackaging(packages.getService());
        tableInfoDto.setServiceImplPackaging(packages.getServiceImpl());
        tableInfoDto.setDaoPackaging(packages.getDao());
        tableInfoDto.setMapperXmlPackaging(packages.getMapperXml());

        TableGeneration tableGeneration = configInfo.getTable();
        tableInfoDto.setTableName(tableGeneration.getName()); // 表名
        tableInfoDto.setRemovePrefix(tableGeneration.getPrefix()); // 前缀

        tableInfoDto.setApplication(configInfo.getApplication());
        tableInfoDto.setTemple(configInfo.getTemple());

        // 表结构
        List<TableDto> list = this.sqlQuery(configInfo);

        return this.generateClazz(list, tableInfoDto);
    }
}
